library(ggplot2)
library(plotly)
Attaching package: ‘plotly’
The following object is masked from ‘package:ggplot2’:
last_plot
The following object is masked from ‘package:stats’:
filter
The following object is masked from ‘package:graphics’:
layout
par(mfrow=c(2,3))
plot(x,y, pch=20)
plot(x,y, pch=20)
abline(h=0.5, col='red')
plot(x,y, pch=20)
abline(v=0.5, col='red')
abline(h=0.5, col='red')
plot(x,y, pch=20)
abline(v=0.33, col='red')
abline(h=0.33, col='red')
abline(v=0.66, col='red')
abline(h=0.66, col='red')
plot(x,y, pch=20)
abline(v=0.25, col='red')
abline(h=0.25, col='red')
abline(v=0.50, col='red')
abline(h=0.50, col='red')
abline(v=0.75, col='red')
abline(h=0.75, col='red')
plot(x,y, pch=20)
abline(v=0.2, col='red')
abline(h=0.2, col='red')
abline(v=0.40, col='red')
abline(h=0.40, col='red')
abline(v=0.6, col='red')
abline(h=0.6, col='red')
abline(v=0.8, col='red')
abline(h=0.8, col='red')
rotate <- function(x) t(apply(x, 2, rev))
matrizAsociadaProbabilidad=function(x,y, xmin, xmax, ymin, ymax, tamanio){
m = matrix(0, ncol=tamanio, nrow=tamanio)
for(punInd in c(1:length(x))){ #Por cada punto
for(c in c(1:ncol(m))){
stepX = (xmax-xmin)/tamanio
if(x[punInd]<stepX*c+xmin & x[punInd]>stepX*(c-1)+xmin ){
#Pertenece a columna c-esima
for(f in c(1:nrow(m))){
stepY = (ymax-ymin)/tamanio
if(y[punInd]<stepY*f+xmin & y[punInd]>stepY*(f-1)+xmin ){
m[c,f] = m[c,f]+1
f = nrow(m)
c = ncol(m)
}
}
}
#segui buscando tu columna
}
}
return((rotate(rotate(rotate(m/length(x))))))
}
rango = 0.015
totx = c()
toty = c()
for (j in c(1:20000)) {
x= runif(2, 0.49, 0.51)
y = runif(2, 0.49, 0.51)
for (i in c(2:250)) {
x[i] = x[i-1]+runif(1,-rango,rango)
y[i] = y[i-1]+runif(1,-rango,rango)
}
totx[j]=x[length(x)]
toty[j]=y[length(y)]
}
x = totx
y = toty
m = matrizAsociadaProbabilidad(x,y, 0,1,0,1, 90)
m
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20] [,21]
[1,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[2,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[3,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[4,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[5,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[6,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000
[7,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005
[8,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[9,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[10,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[11,] 0 0 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0.00000 0e+00 0e+00 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000
[,22] [,23] [,24] [,25] [,26] [,27] [,28] [,29] [,30] [,31] [,32] [,33] [,34] [,35] [,36] [,37] [,38] [,39]
[1,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[2,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[3,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000
[4,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000
[5,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[6,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[7,] 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[8,] 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00005 0.00000 0.00000 0.00000
[9,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[10,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005
[11,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00005 0.00000 0.00005 0.00000 0.00010
[,40] [,41] [,42] [,43] [,44] [,45] [,46] [,47] [,48] [,49] [,50] [,51] [,52] [,53] [,54] [,55] [,56] [,57]
[1,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[2,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[3,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[4,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[5,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[6,] 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[7,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00005 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[8,] 0.00000 0.00000 0.00005 0.00000 0.00000 0.00005 0.00005 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[9,] 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00005 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[10,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000
[11,] 0.00010 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000
[,58] [,59] [,60] [,61] [,62] [,63] [,64] [,65] [,66] [,67] [,68] [,69] [,70] [,71] [,72] [,73] [,74] [,75]
[1,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[2,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[3,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[4,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[5,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[6,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000
[7,] 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[8,] 0.00000 0.00000 0.00000 0.00000 0.00005 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[9,] 0.00000 0.00000 0.00005 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[10,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[11,] 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00005 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
[,76] [,77] [,78] [,79] [,80] [,81] [,82] [,83] [,84] [,85] [,86] [,87] [,88] [,89] [,90]
[1,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[2,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[3,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[4,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[5,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[6,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[7,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[8,] 0.00000 0.00005 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[9,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[10,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[11,] 0.00000 0.00000 0.00000 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00 0e+00
[ reached getOption("max.print") -- omitted 79 rows ]
plot(x,y, xlim=c(0,1), ylim=c(0,1))

evaluarEnMatriz=function(m,x,y, xmin, xmax, ymin, ymax, tamanio){
for(c in c(1:ncol(m))){
stepX = (xmax-xmin)/tamanio
if(x<stepX*c+xmin & x>stepX*(c-1)+xmin ){
#Pertenece a columna c-esima
for(f in c(1:nrow(m))){
stepY = (ymax-ymin)/tamanio
if(y<stepY*f+xmin & y>stepY*(f-1)+xmin ){
return(m[c,f])
}
}
}
}
}
evaluarEnMatriz(m, 0.72,0.51,0,1,0,1,10)
z = c(1:length(x))
for (i in 1:length(x)) {
#print(x[i])
if(is.null(x[i])){
x[i]=0.5
}
if(is.null(y[i])){
y[i]=0.5
}
if(x[i]>=1){
x[i]=0.99
}
if(x[i]<=0){
x[i]=0.01
}
if(y[i]>=1){
y[i]=0.99
}
if(y[i]<=0){
y[i]=0.01
}
#print(i)
z[i]= evaluarEnMatriz(m, x[i],y[i],0,1,0,1,90)
}
xs = x
ys = y
zs = z
fig <- plot_ly(x=~xs, y=~ys, z=~zs, type="scatter3d", mode="markers", size = 1)
fig <- fig %>% layout(title = '3 zonas distribuicion',
xaxis = list(title = 'Superficie cubierta',
zeroline = TRUE,
range = c(0, 250)),
yaxis = list(title = 'Habitaciones',
range = c(0,1400)))
fig
LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KHBsb3RseSkKYGBgCgoKYGBge3J9CnBhcihtZnJvdz1jKDIsMykpCnBsb3QoeCx5LCBwY2g9MjApCnBsb3QoeCx5LCBwY2g9MjApCmFibGluZShoPTAuNSwgY29sPSdyZWQnKQpwbG90KHgseSwgcGNoPTIwKQphYmxpbmUodj0wLjUsIGNvbD0ncmVkJykKYWJsaW5lKGg9MC41LCBjb2w9J3JlZCcpCnBsb3QoeCx5LCBwY2g9MjApCmFibGluZSh2PTAuMzMsIGNvbD0ncmVkJykKYWJsaW5lKGg9MC4zMywgY29sPSdyZWQnKQphYmxpbmUodj0wLjY2LCBjb2w9J3JlZCcpCmFibGluZShoPTAuNjYsIGNvbD0ncmVkJykKcGxvdCh4LHksIHBjaD0yMCkKYWJsaW5lKHY9MC4yNSwgY29sPSdyZWQnKQphYmxpbmUoaD0wLjI1LCBjb2w9J3JlZCcpCmFibGluZSh2PTAuNTAsIGNvbD0ncmVkJykKYWJsaW5lKGg9MC41MCwgY29sPSdyZWQnKQphYmxpbmUodj0wLjc1LCBjb2w9J3JlZCcpCmFibGluZShoPTAuNzUsIGNvbD0ncmVkJykKcGxvdCh4LHksIHBjaD0yMCkKYWJsaW5lKHY9MC4yLCBjb2w9J3JlZCcpCmFibGluZShoPTAuMiwgY29sPSdyZWQnKQphYmxpbmUodj0wLjQwLCBjb2w9J3JlZCcpCmFibGluZShoPTAuNDAsIGNvbD0ncmVkJykKYWJsaW5lKHY9MC42LCBjb2w9J3JlZCcpCmFibGluZShoPTAuNiwgY29sPSdyZWQnKQphYmxpbmUodj0wLjgsIGNvbD0ncmVkJykKYWJsaW5lKGg9MC44LCBjb2w9J3JlZCcpCmBgYApgYGB7cn0Kcm90YXRlIDwtIGZ1bmN0aW9uKHgpIHQoYXBwbHkoeCwgMiwgcmV2KSkKYGBgCgpgYGB7cn0KbWF0cml6QXNvY2lhZGFQcm9iYWJpbGlkYWQ9ZnVuY3Rpb24oeCx5LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4LCB0YW1hbmlvKXsKICBtID0gbWF0cml4KDAsIG5jb2w9dGFtYW5pbywgbnJvdz10YW1hbmlvKQogIGZvcihwdW5JbmQgaW4gYygxOmxlbmd0aCh4KSkpeyAjUG9yIGNhZGEgcHVudG8KICAgIGZvcihjIGluIGMoMTpuY29sKG0pKSl7CiAgICAgIHN0ZXBYID0gKHhtYXgteG1pbikvdGFtYW5pbwogICAgICBpZih4W3B1bkluZF08c3RlcFgqYyt4bWluICYgeFtwdW5JbmRdPnN0ZXBYKihjLTEpK3htaW4gKXsKICAgICAgICAjUGVydGVuZWNlIGEgY29sdW1uYSBjLWVzaW1hCiAgICAgICAgZm9yKGYgaW4gYygxOm5yb3cobSkpKXsKICAgICAgICAgIHN0ZXBZID0gKHltYXgteW1pbikvdGFtYW5pbwogICAgICAgICAgaWYoeVtwdW5JbmRdPHN0ZXBZKmYreG1pbiAmIHlbcHVuSW5kXT5zdGVwWSooZi0xKSt4bWluICl7CiAgICAgICAgICAgIG1bYyxmXSA9IG1bYyxmXSsxCiAgICAgICAgICAgIGYgPSBucm93KG0pCiAgICAgICAgICAgIGMgPSBuY29sKG0pCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgICNzZWd1aSBidXNjYW5kbyB0dSBjb2x1bW5hCiAgICB9CiAgfQogIHJldHVybigocm90YXRlKHJvdGF0ZShyb3RhdGUobS9sZW5ndGgoeCkpKSkpKQp9CmBgYApgYGB7cn0KcmFuZ28gPSAwLjAxNQp0b3R4ID0gYygpCnRvdHkgPSBjKCkKZm9yIChqIGluIGMoMToyMDAwMCkpIHsKICB4PSBydW5pZigyLCAwLjQ5LCAwLjUxKQogIHkgPSBydW5pZigyLCAwLjQ5LCAwLjUxKQogIGZvciAoaSBpbiBjKDI6MjUwKSkgewogICAgeFtpXSA9IHhbaS0xXStydW5pZigxLC1yYW5nbyxyYW5nbykgCiAgICB5W2ldID0geVtpLTFdK3J1bmlmKDEsLXJhbmdvLHJhbmdvKSAKICB9CiAgdG90eFtqXT14W2xlbmd0aCh4KV0KICB0b3R5W2pdPXlbbGVuZ3RoKHkpXQp9CnggPSB0b3R4CnkgPSB0b3R5CmBgYApgYGB7cn0KbSA9IG1hdHJpekFzb2NpYWRhUHJvYmFiaWxpZGFkKHgseSwgMCwxLDAsMSwgOTApCm0KcGxvdCh4LHksIHhsaW09YygwLDEpLCB5bGltPWMoMCwxKSkKYGBgCgpgYGB7cn0KZXZhbHVhckVuTWF0cml6PWZ1bmN0aW9uKG0seCx5LCB4bWluLCB4bWF4LCB5bWluLCB5bWF4LCB0YW1hbmlvKXsKICAgIGZvcihjIGluIGMoMTpuY29sKG0pKSl7CiAgICAgIHN0ZXBYID0gKHhtYXgteG1pbikvdGFtYW5pbwogICAgICBpZih4PHN0ZXBYKmMreG1pbiAmIHg+c3RlcFgqKGMtMSkreG1pbiApewogICAgICAgICNQZXJ0ZW5lY2UgYSBjb2x1bW5hIGMtZXNpbWEKICAgICAgICBmb3IoZiBpbiBjKDE6bnJvdyhtKSkpewogICAgICAgICAgc3RlcFkgPSAoeW1heC15bWluKS90YW1hbmlvCiAgICAgICAgICBpZih5PHN0ZXBZKmYreG1pbiAmIHk+c3RlcFkqKGYtMSkreG1pbiApewogICAgICAgICAgICByZXR1cm4obVtjLGZdKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogIH0KfQpgYGAKCmBgYHtyfQpldmFsdWFyRW5NYXRyaXoobSwgMC43MiwwLjUxLDAsMSwwLDEsMTApCmBgYAoKCmBgYHtyfQp6ID0gYygxOmxlbmd0aCh4KSkKZm9yIChpIGluIDE6bGVuZ3RoKHgpKSB7CiAgI3ByaW50KHhbaV0pCgogIGlmKGlzLm51bGwoeFtpXSkpewogICAgeFtpXT0wLjUKICB9CiAgaWYoaXMubnVsbCh5W2ldKSl7CiAgICB5W2ldPTAuNQogIH0KICBpZih4W2ldPj0xKXsKICAgIHhbaV09MC45OQogIH0KICBpZih4W2ldPD0wKXsKICAgIHhbaV09MC4wMQogIH0KICBpZih5W2ldPj0xKXsKICAgIHlbaV09MC45OQogIH0KICBpZih5W2ldPD0wKXsKICAgIHlbaV09MC4wMQogIH0KICAjcHJpbnQoaSkKICB6W2ldPSBldmFsdWFyRW5NYXRyaXoobSwgeFtpXSx5W2ldLDAsMSwwLDEsOTApCn0KYGBgCgpgYGB7cn0KeHMgPSB4CnlzID0geQp6cyA9IHoKZmlnIDwtIHBsb3RfbHkoeD1+eHMsIHk9fnlzLCB6PX56cywgdHlwZT0ic2NhdHRlcjNkIiwgbW9kZT0ibWFya2VycyIsICBzaXplID0gMSkKZmlnIDwtIGZpZyAlPiUgbGF5b3V0KHRpdGxlID0gJzMgem9uYXMgZGlzdHJpYnVpY2lvbicsCiAgICAgICAgIHhheGlzID0gbGlzdCh0aXRsZSA9ICdTdXBlcmZpY2llIGN1YmllcnRhJywKICAgICAgICAgICAgICAgICAgICAgIHplcm9saW5lID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgIHJhbmdlID0gYygwLCAyNTApKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHRpdGxlID0gJ0hhYml0YWNpb25lcycsCiAgICAgICAgICAgICAgICAgICAgICByYW5nZSA9IGMoMCwxNDAwKSkpCgpmaWcKYGBgCgoK